/**
 * Класс контакт листа
 * 
 * @constructor
 */ 
function CContactList(parentClass) 
{
	var userProfileUIN 		= undefined;
	var thisContactListClass= this;
	var parentClass 		= parentClass;
	var AJAXQuery 			= parentClass.getAJAXQuery();
	var	last_modified		= undefined;
	
	/**
	 * Конструктор класса
	 */
	this.__CContactList = function() 
	{
		// Запрос контакт листа
		AJAXQuery.MakeAJAXQuery("getUserProfileInfo", undefined, this.ajaxUserProfileInfoReturn);
		AJAXQuery.MakeAJAXQuery("GetUserContactList", undefined, this.ajaxContactListReturn);
	};
	/**
	 * 
	 */
	this.getAJAXQuery = function() 
	{
		return AJAXQuery;
	};
	/**
	 * @return Возвращает окно контакт листа
	 * @type jquery
	 */ 	
	this.getContactListWin = function() 
	{
		return $('#DialogContactList div.cl-contactlist-panel');
	};
	/**
	 * Возвращает класс статусов
	 * @return CStatuses
	 */ 
	this.getStatuses = function() 
	{
		return parentClass.statuses;
	};
	/**
	 * @return Возвращает UIN профиля пользователя
	 * @type string
	 */
	this.getUserProfileUIN = function() 
	{
		return userProfileUIN;
	};
	/**
	 * Устанавливает UIN профиля пользователя
	 */
	this.setUserProfileUIN = function(newUIN) 
	{
		userProfileUIN = newUIN;
	};
	/**
	 * Открывает и активизирует окно сообщений контакта
	 */
	this.showContactWindow = function(UIN) 
	{
		parentClass.createNewWindow(UIN);
		parentClass.activateWindow(UIN);
	};
	/**
	 * Вызывается при успшном получении данных с сервера
	 * @private
	 */
	this.ajaxContactListReturn = function(xml) 
	{
		var contacts = $("contact_list > c",xml),
			currentElement = undefined,
			statuses = thisContactListClass.getStatuses();
		
		if (contacts.length != 0) {
			last_modified = $("contact_list",xml).attr('lm');
			AddLogMessage('Ajax query return: ' + contacts.length + ' contacts');
			
			var clWin = thisContactListClass.getContactListWin(),
				newContacts = new Array();
			
			for (var i=0; i<contacts.length; i++) {
				currentElement = contacts.eq(i);
				var attr = {
						uin   	  : currentElement.attr('u'),
						name  	  : currentElement.attr('n'),
						status	  : currentElement.attr('s'),
						statustext: currentElement.attr('st'),
						protocol  : currentElement.attr('p')
					};

				var status = statuses.getStatusPicture(attr.status),
					statusClass = '';
				
				if (status == '') {
					statusClass = statuses.getStatusPicture('STATUS_OFFLINE');
				}else{
					statusClass = status;
				}
				
				var findContact = $('*[@contact_id=' + attr.uin + ']', clWin),
					NewContact = undefined,
					contactIsNew = false;
				
				if (findContact.length == 0) {
					contactIsNew = true;
					var NewContactStr = defaultTemplate.contactTemplate.replace(/{id}/g, attr.uin).replace(/{name}/g, attr.name);;
					NewContact = $(NewContactStr)
						.addClass(defaultTemplate.contactClass)
						.attr('protocol', attr.protocol)
						.hover(
								function(){
									$(this).addClass('ui-state-hover');
								},
								function(){
									$(this).removeClass('ui-state-hover');
								})
						.click(
							function(){
								$('*[@type_=cl-contact]', thisContactListClass.getContactListWin()).removeClass('ui-state-highlight');
								$(this).addClass('ui-state-highlight');
								return false;
							})
						.dblclick(
							function(){
								var statusClass = $('*[@type_=cl-contact-status]', this)
									.attr('class')
									.replace(/[\s^]cl-contactlist-status|cl-statusicon[\s$]/g,'')
									;
								
								createTab({
									id: $(this).attr('contact_id'),
									name		: $('*[@type_=cl-contact-name]', this).text(),
									label		: $('*[@type_=cl-contact-name]', this).text(),
									showIt		: true,
									statusClass : statusClass
									});
								return false;
							})
						.attr('isonline', statuses.getStatusIsOnline(attr.status) ? '1' : '0')
//						.appendTo(clWin)
						;
					
					//alert(attr.uin);
					$('*[@type_=cl-contact-status]', NewContact)
						.addClass(defaultTemplate.contactStatusClass)
						.addClass(defaultTemplate.contactStatusIconClass)
						.addClass(statusClass);
						;
				}else{
					NewContact = findContact; 
				}
				
				$('*[@type_=cl-contact-name]', NewContact)
					.addClass(defaultTemplate.contactNameClass);
				
				// Статус поменялся, нужно переместить
				if (NewContact.attr('isonline') != (statuses.getStatusIsOnline(attr.status) ? '1' : '0')) {

					NewContact
						.attr('isonline', statuses.getStatusIsOnline(attr.status) ? '1' : '0');
					
					if (statuses.getStatusIsOnline(attr.status)) {
						var firstchild = $('div[@type_=cl-contact]:first-child',clWin);
						if (firstchild.length !=0) {
							NewContact.insertBefore(firstchild);
						}
					} else {
						var lastchild = $('div[@type_=cl-contact]:last-child',clWin);
						if (lastchild.length !=0) {
							NewContact.insertAfter(lastchild);
						}
					}
				}
				
				// Поменяем статус контакта во всех окнах
				$('*[@contact_id='+attr.uin+'] div[@type_=cl-contact-status]')
					.each(
						function(){
							var tmpClasses = $(this).attr('class');
							tmpClasses = tmpClasses.replace(/cl-statusicon-.*?($|\s)/g, '');
							$(this)
								.removeClass()
								.addClass(statusClass)
								.addClass(tmpClasses)
								.attr('title', statuses.getStatusName(attr.status)); 
						});
				
				if (contactIsNew) {
					newContacts[newContacts.length] = NewContact;
				}
				
			}; // Все контакты перебрали
			
			$('#loadingCl').fadeOut();

			$.each(newContacts, 
					function(indexInArray, valueOfElement){
						valueOfElement.appendTo(clWin);
					});
			
			
			if ($('#DialogContactList *[@showOnlyOnline]').attr('showOnlyOnline') == '1') {
				// Уберем тех кто ушел off-line
				$('#DialogContactList *[@isonline=0]').slideUp();
				// Покажем кто вернулся online
				$('#DialogContactList *[@isonline=1]:hidden').slideDown();
			}
		}
		 
		AJAXQuery.MakeAJAXQuery("GetUserContactList",{lm: last_modified}, thisContactListClass.ajaxContactListReturn);
	};
	/**
	 * вызывается при успешном получении данных с сервера о профиле пользователя
	 */
	this.ajaxUserProfileInfoReturn = function(xml) 
	{
		var userProfileInfo = $("data > userprofile",xml);
		userProfileUIN = userProfileInfo.attr('uin');
		AJAXQuery.setRefreshTime(userProfileInfo.attr('clientrefreshtime')*1000);

		var statuses = thisContactListClass.getStatuses();
		var status = statuses.getStatusPicture(userProfileInfo.attr('status'));
		var statusName = statuses.getStatusName(userProfileInfo.attr('status'));
		
		var statusClass = '';
		if (status == '') {
			statusClass = statuses.getStatusPicture('STATUS_OFFLINE');
		}else{
			statusClass = status;
		}

		$('*.cl-user-status-button div[@type_=statusname]').text(statusName);
		$('*.cl-user-status-button div.cl-statusicon').addClass(status);
		$('*.cl-user-status-button').attr('userstatus', userProfileInfo.attr('status'));
		
	};
	
	// Инициализация класса
	this.__CContactList();
};

